home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 24
/
Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso
/
Aminet
/
gfx
/
show
/
GS510_data.lha
/
ghostscript
/
5.10
/
gs_ttf.ps
< prev
next >
Wrap
Text File
|
1997-12-28
|
15KB
|
462 lines
% Copyright (C) 1996, 1997 Aladdin Enterprises. All rights reserved.
%
% This file is part of Aladdin Ghostscript.
%
% Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author
% or distributor accepts any responsibility for the consequences of using it,
% or for whether it serves any particular purpose or works at all, unless he
% or she says so in writing. Refer to the Aladdin Ghostscript Free Public
% License (the "License") for full details.
%
% Every copy of Aladdin Ghostscript must include a copy of the License,
% normally in a plain ASCII text file named PUBLIC. The License grants you
% the right to copy, modify and redistribute Aladdin Ghostscript, but only
% under certain conditions described in the License. Among other things, the
% License requires that the copyright notice and this notice be preserved on
% all copies.
% Support code for direct use of TrueType fonts.
% (Not needed for Type 42 fonts.)
% ---------------- Font loading machinery ---------------- %
% Augment the FONTPATH machinery so it recognizes TrueType fonts.
/.scanfontheaders where % only defined if DISKFONTS is recognized
{ pop
/.scanfontheaders [ .scanfontheaders aload pop (\000\001\000\000*) ] def
}
if
/.findnonttfontvalue /.findfontvalue load def
/.findfontvalue % <file> <key> .findfontvalue <value> true
% <file> <key> .findfontvalue false
% Closes the file in either case.
{ 1 index read pop 2 index 1 index unread 0 eq
{ % If this is a font at all, it's a TrueType font.
dup /FontType eq
{ pop closefile 42 true }
{ dup /FontName eq
{ pop .findttfontname }
{ pop closefile false }
ifelse
}
ifelse
}
{ % Not a TrueType font.
.findnonttfontvalue
}
ifelse
} bind def
/.findttfontname % <file> .findttfontname <fname> true
% <file> .findttfontname false
% Closes the file in either case.
{ .loadttfonttables
(name) findtableentry
{ dup 8 getu32 f exch setfileposition
12 getu32 string f exch readstring pop
6 findname
}
{ false
}
ifelse
f closefile end end
} bind def
% Load a font file that might be a TrueType font.
/.loadnonttfontfile /.loadfontfile load def
/.loadfontfile % <file> .loadfontfile -
{ dup read pop 2 copy unread 0 eq
{ % If this is a font at all, it's a TrueType font.
.loadttfont pop
}
{ % Not a TrueType font.
.loadnonttfontfile
}
ifelse
} bind def
% ---------------- Automatic Type 42 generation ---------------- %
% Load a TrueType font from a file as a Type 42 PostScript font.
% The thing that makes this really messy is the handling of encodings.
% There are 3 interacting tables that affect the encoding:
% 'cmap' provides multiple maps from character codes to glyph indices
% 'glyf' maps glyph indices to outlines
% 'post' maps glyph indices to glyph names (if present)
% What we need to get out of this is:
% Encoding mapping character codes to glyph names
% (the composition of cmap and post)
% CharStrings mapping glyph names to glyph indices
% (the inverse of post)
% If the post table is missing, we have to take a guess based on the cmap
% table.
/.loadttfontdict mark
/orgXUID 107 def % Aladdin Enterprises organization XUID
/maxstring 65500 def % maximum length of a PostScript string
% Define the Macintosh standard mapping from characters to glyph indices.
/MacRomanEncoding dup .findencoding def
/MacGlyphEncoding mark
/.notdef /.null /CR
MacRomanEncoding 32 95 getinterval aload pop
MacRomanEncoding 128 45 getinterval aload pop
% 143
/notequal /AE
/Oslash /infinity /plusinus /lessequal /greaterequal
/yen /mu1 /partialdiff /summation /product
/pi /integral /ordfeminine /ordmasculine /Ohm
/ae /oslash /questiondown /exclamdown /logicalnot
/radical /florin /approxequal /increment /guillemotleft
/guillemotright /ellipsis /nbspace
MacRomanEncoding 203 12 getinterval aload pop
/lozenge
MacRomanEncoding 216 24 getinterval aload pop
/applelogo
MacRomanEncoding 241 7 getinterval aload pop
/overscore
MacRomanEncoding 249 7 getinterval aload pop
% 226
/Lslash /lslash /Scaron /scaron
/Zcaron /zcaron /brokenbar /Eth /eth
/Yacute /yacute /Thorn /thorn /minus
/multiply /onesuperior /twosuperior /threesuperior /onehalf
/onequarter /threequarters /franc /Gbreve /gbreve
/Idot /Scedilla /scedilla /Cacute /cacute
/Ccaron /ccaron /dmacron
/packedarray where
{ pop counttomark packedarray exch pop }
{ ] readonly }
ifelse def
% Procedures
/getu16 % <string> <index> getu16 <integer>
{ 2 copy get 8 bitshift 3 1 roll 1 add get add
} bind def
/gets16 % <string> <index> gets16 <integer>
{ getu16 16#8000 xor 16#8000 sub
} bind def
/getu32 % <string> <index> getu32 <integer>
{ 2 copy getu16 16 bitshift 3 1 roll 2 add getu16 add
} bind def
/gets32 % <string> <index> gets32 <integer>
{ getu32 dup 16#7fffffff gt { 4 { 16#40000000 sub } repeat } if
} bind def
/getrange % <offset> <length> getrange <string>
% Free variables: sfnts
{ () sfnts
{ % Stack: offset length () sfnt
dup length 4 index gt { exch pop exit } if
4 -1 roll exch length sub 3 1 roll
}
forall 3 1 roll getinterval
} bind def
/findtableentry % <name4> findtableentry <tableentry> true
% <name4> findtableentry false
% Free variables: tables
{ false 0 16 tables length 16 sub
{ % Stack: name4 false toffset
tables 1 index 4 getinterval 3 index eq
{ tables exch 16 getinterval
exch pop exch true exit
}
if pop
}
for exch pop
} bind def
/findtable % <name4> findtable <table> true
% <name4> findtable false
% Free variables: tables
{ findtableentry
{ dup 8 getu32 exch 12 getu32 getrange true }
{ false }
ifelse
} bind def
/findname % <nametable> <nameid> findname <string> true
% <nametable> <nameid> findname false
{ false 3 1 roll 0 1 3 index 2 getu16 1 sub
{ % Stack: false table id index
12 mul 6 add 2 index exch 12 getinterval
dup 6 getu16 2 index eq
{ % We found the name we want.
exch pop
% Stack: false table record
dup 10 getu16 2 index 4 getu16 add
1 index 8 getu16 4 -1 roll 3 1 roll getinterval exch
% Stack: false string record
% Check for 8- vs. 16-bit characters.
is2byte { string2to1 } if true null 4 -1 roll exit
}
if pop
}
for pop pop
} bind def
/is2byte % <namerecord> is2byte <bool>
{ dup 0 getu16
{ { pop true } % Apple Unicode
{ pop false } % Macintosh Script manager
{ 1 getu16 1 eq } % ISO
{ 1 getu16 1 eq } % Microsoft
}
exch get exec
} bind def
/string2to1 % <string2> string2to1 <string>
{ dup length 2 idiv string dup
0 1 3 index length 1 sub
{ 3 index 1 index 2 mul 1 add get put dup }
for pop exch pop
} bind def
/cmapformats mark
% Each procedure in this dictionary is called as follows:
% -mark- encodingtable <<proc>> -mark- glyphindices...
0 % Apple standard 1-to-1 mapping.
{ 6 256 getinterval { } forall
} bind
4 % Microsoft/Adobe segmented mapping.
{ /etab exch def
/nseg2 etab 6 getu16 def
14 /endc etab 2 index nseg2 getinterval def
% The Apple TrueType documentation omits the 2-byte
% 'reserved pad' that follows the endCount vector!
2 add
nseg2 add /startc etab 2 index nseg2 getinterval def
nseg2 add /iddelta etab 2 index nseg2 getinterval def
nseg2 add /idroff etab 2 index nseg2 getinterval def
% The following hack allows us to properly handle
% idiosyncratic fonts that start at 0xf000:
/firstcode startc 0 getu16 16#ff00 and def
pop 0 2 nseg2 3 sub
{ /i2 exch def
/scode startc i2 getu16 def
counttomark scode firstcode sub 256 min exch sub 0 max { 0 } repeat
/ecode endc i2 getu16 def
/delta iddelta i2 getu16 def
idroff i2 getu16 dup 0 eq
{ pop scode 1 ecode { delta add 65535 and } for
}
{ % The +2 is for the 'reserved pad'.
/gloff exch 14 nseg2 3 mul add 2 add i2 add add def
0 1 ecode scode sub
{ 2 mul gloff add etab exch getu16
dup 0 ne { delta add 65535 and } if
}
for
}
ifelse
}
fo